البرمجة

المصفوفات في جافا للمبتدئين

مقدمة إلى المصفوفات (Arrays) في جافا

تُعد المصفوفات (Arrays) من أهم هياكل البيانات الأساسية في لغة جافا، وهي تُستخدم لتخزين مجموعة من العناصر المتجانسة، أي من نفس النوع، داخل حاوية واحدة ذات حجم ثابت. يعتمد كثير من البرمجيات على المصفوفات لأداء عمليات متكررة ومنظمة بكفاءة، وتُعد من اللبنات الأولى التي يجب على كل مبرمج إتقانها لفهم كيفية إدارة البيانات وتخزينها في الذاكرة.

في جافا، تُستخدم المصفوفات لتخزين البيانات في مواقع متجاورة من الذاكرة، ما يسمح بالوصول السريع والسهل إلى كل عنصر باستخدام فهرس (Index) يبدأ من الصفر. هذه الخصائص تجعل من المصفوفات أداة فعالة لمعالجة البيانات وتنظيمها، وتُعد حجر الأساس لفهم هياكل بيانات أكثر تعقيدًا كالقوائم المتصلة، والمكدسات، والطوابير، والمصفوفات متعددة الأبعاد.

تعريف المصفوفة في جافا

المصفوفة هي بنية بيانات تقوم بتخزين عدد ثابت من العناصر من نفس النوع. يتم الإعلان عن المصفوفة في جافا باستخدام البنية التالية:

java
type[] arrayName;

على سبيل المثال، لتعريف مصفوفة تحتوي على أعداد صحيحة:

java
int[] numbers;

هذا التصريح يُعلن عن متغير “numbers” كمصفوفة من الأعداد الصحيحة، ولكن دون تخصيص حجم أو قيم بعد.

إنشاء المصفوفة وتخصيص الذاكرة

بعد الإعلان عن المصفوفة، يجب إنشاء كائن للمصفوفة باستخدام الكلمة المفتاحية new لتخصيص حجمها في الذاكرة:

java
numbers = new int[5];

هذا السطر يقوم بإنشاء مصفوفة من 5 عناصر، تُخزن فيها أعداد صحيحة. يمكن أيضًا دمج الإعلان والإنشاء في سطر واحد:

java
int[] numbers = new int[5];

التهيئة المباشرة لعناصر المصفوفة

من الممكن تهيئة عناصر المصفوفة مباشرة عند إعلانها:

java
int[] numbers = {10, 20, 30, 40, 50};

في هذا المثال، تم إنشاء مصفوفة تحتوي على خمسة عناصر بقيم معروفة مسبقًا.

الوصول إلى عناصر المصفوفة

يتم الوصول إلى عناصر المصفوفة باستخدام الفهرس:

java
System.out.println(numbers[0]); // تطبع 10 numbers[2] = 35; // تغيير العنصر الثالث ليصبح 35

تبدأ الفهارس في جافا من الرقم 0، ما يعني أن numbers[0] يشير إلى أول عنصر في المصفوفة، وnumbers[4] يشير إلى آخر عنصر في مصفوفة من خمسة عناصر.

خصائص المصفوفات في جافا

  1. نوع بيانات موحد: لا يمكن تخزين أنواع مختلفة من البيانات في مصفوفة واحدة. جميع العناصر يجب أن تكون من نفس النوع.

  2. طول ثابت: لا يمكن تغيير حجم المصفوفة بعد إنشائها. يجب معرفة عدد العناصر مسبقًا.

  3. تخزين متجاور: تُخزن عناصر المصفوفة في مواقع متجاورة في الذاكرة.

  4. الوصول السريع: يمكن الوصول إلى أي عنصر بسرعة باستخدام الفهرس.

المصفوفات ككائنات في جافا

في جافا، المصفوفة تُعتبر كائنًا (Object)، وهي تُخزن في الذاكرة باستخدام المرجع (reference). عند طباعة مصفوفة باستخدام System.out.println(numbers) سيتم طباعة اسم الصنف وموقع الذاكرة وليس القيم المخزنة داخل المصفوفة.

java
int[] numbers = {1, 2, 3, 4, 5}; System.out.println(numbers); // النتيجة: [I@15db9742 (مثال)

لذلك يتم استخدام الحلقات لطباعة عناصر المصفوفة:

java
for (int i = 0; i < numbers.length; i++) { System.out.println(numbers[i]); }

خاصية length في المصفوفات

توفر جافا خاصية length التي تُستخدم لمعرفة عدد العناصر في المصفوفة:

java
System.out.println(numbers.length); // تطبع 5

استخدام الحلقات مع المصفوفات

أحد الاستخدامات الشائعة للمصفوفات هو التعامل معها باستخدام الحلقات مثل for وfor-each:

حلقة for التقليدية:

java
for (int i = 0; i < numbers.length; i++) { System.out.println(numbers[i]); }

حلقة for-each:

java
for (int num : numbers) { System.out.println(num); }

تُعد حلقة for-each مفيدة في قراءة عناصر المصفوفة دون الحاجة إلى استخدام الفهارس، لكنها لا تُستخدم عند الحاجة إلى تعديل القيم أو معرفة موقع العنصر.

المصفوفات متعددة الأبعاد

يمكن إنشاء مصفوفات تحتوي على أكثر من بعد، مثل المصفوفة الثنائية (مصفوفة من مصفوفات):

java
int[][] matrix = new int[3][4];

هذا الإعلان يُنشئ مصفوفة تحتوي على 3 صفوف و4 أعمدة. ويتم الوصول إلى عناصرها باستخدام الفهرسين:

java
matrix[0][1] = 5; System.out.println(matrix[0][1]); // تطبع 5

تهيئة مصفوفة ثنائية الأبعاد مباشرة:

java
int[][] matrix = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };

المصفوفات كوسائط في الدوال

يمكن تمرير المصفوفات كوسائط إلى الدوال:

java
public static void printArray(int[] array) { for (int value : array) { System.out.println(value); } }

وتُستدعى الدالة كالتالي:

java
int[] data = {10, 20, 30}; printArray(data);

الترتيب والبحث في المصفوفات

توفر مكتبة java.util.Arrays مجموعة من الأدوات المفيدة للتعامل مع المصفوفات مثل الترتيب والبحث والنسخ:

ترتيب المصفوفة:

java
import java.util.Arrays; int[] numbers = {5, 2, 8, 1}; Arrays.sort(numbers); // يتم ترتيبها تصاعديًا

البحث الثنائي:

java
int index = Arrays.binarySearch(numbers, 5); // يعيد فهرس العنصر

يجب أن تكون المصفوفة مرتبة قبل استخدام binarySearch.

نسخ المصفوفات:

java
int[] copy = Arrays.copyOf(numbers, numbers.length);

جدول مقارنة أنواع المصفوفات

النوع عدد الأبعاد طريقة الوصول الاستخدام الشائع
مصفوفة أحادية البعد 1 array[i] تخزين قوائم بسيطة
مصفوفة ثنائية البعد 2 array[i][j] الجداول والمصفوفات الرياضية
مصفوفة ثلاثية الأبعاد أو أكثر 3+ array[i][j][k]... معالجة الصور، الرسوم ثلاثية الأبعاد

المصفوفات مقابل هياكل البيانات الديناميكية

على الرغم من قوة المصفوفات وسهولة استخدامها، إلا أن أحد القيود الجوهرية لها هو حجمها الثابت. لا يمكن تغيير حجم المصفوفة بعد إنشائها، مما قد يؤدي إلى إهدار الذاكرة أو عدم كفاية السعة. في المقابل، توفر جافا هياكل بيانات ديناميكية مثل ArrayList التي تسمح بتغيير الحجم تلقائيًا.

مثال على ArrayList:

java
import java.util.ArrayList; ArrayList list = new ArrayList<>(); list.add(10); list.add(20);

لكن من المهم فهم المصفوفات أولاً قبل التعمق في هذه الهياكل المعقدة.

معالجة الأخطاء المرتبطة بالمصفوفات

أحد الأخطاء الشائعة عند التعامل مع المصفوفات هو ArrayIndexOutOfBoundsException، ويحدث عند محاولة الوصول إلى فهرس غير موجود في المصفوفة:

java
int[] numbers = {1, 2, 3}; System.out.println(numbers[3]); // يسبب خطأ، لأن الفهارس تنتهي عند 2

تجنب هذا الخطأ يكون من خلال التأكد دائمًا من أن الفهرس يقع ضمن نطاق 0 إلى array.length - 1.

خلاصة

المصفوفات تُعد أداة أساسية في البرمجة بلغة جافا، إذ توفر وسيلة فعالة لتخزين كميات كبيرة من البيانات المتجانسة بطريقة منظمة وفعالة. تعلّم كيفية إعلان وإنشاء واستخدام المصفوفات يمكن أن يُحدث فارقًا كبيرًا في قدرة المبرمج على تصميم الخوارزميات ومعالجة البيانات. كما أن فهم المصفوفات يُعد خطوة أولى نحو استيعاب هياكل بيانات أكثر تقدمًا، تُستخدم بشكل شائع في البرمجة الاحترافية وتطوير التطبيقات المعقدة.

المراجع